package com.komeri.komeriapl;

import static com.komeri.komeriapl.Constants.*;

import com.google.android.gms.gcm.GoogleCloudMessaging;

import android.app.IntentService;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.support.v4.app.NotificationCompat;
import android.util.Log;

/**
 * GCMインテントサービス
 * プッシュ通知受信時のUI表示処理をバックグラウンド（別スレッド）で行う
 */
public class GcmIntentService extends IntentService {
    
	/** Log出力用のタグ */
	private static final String TAG = GcmIntentService.class.getSimpleName();
		
	
    /**
     * コンストラクタ
     */
    public GcmIntentService() {
        super("GcmIntentService");
    }
    
    /**
     * インテントサービスで実行したい処理を記述する
     */
    @Override
    protected void onHandleIntent(Intent intent) {
    	Log.d(TAG, "onHandleIntent");
    	
        Bundle extras = intent.getExtras();  
        if (!extras.isEmpty()) {
        	// ブロードキャストレシーバーで受信したインテントからメッセージタイプを取得
            GoogleCloudMessaging gcm = GoogleCloudMessaging.getInstance(this);
            String messageType = gcm.getMessageType(intent);
            
            if (GoogleCloudMessaging.MESSAGE_TYPE_MESSAGE.equals(messageType)) {
            	// メッセージを受信した場合               
                // メッセージを、ノーティフィケーションに表示する
                sendNotification(intent);
            } else {
            	// エラー等の場合
            	Log.e(TAG, messageType + ": " + extras.toString());
            }            
        }
        
        // スリープ状態への遷移禁止を解除する
        GcmBroadcastReceiver.completeWakefulIntent(intent);
    }
    
    /**
     * ノーティフィケーション表示を行う
     * @param intent インテント
     */
    private void sendNotification(Intent intent) {
		
		NotificationCompat.Builder builder = new NotificationCompat.Builder(this);
        
        Bundle extras = intent.getExtras();
        int id = Integer.parseInt(extras.getString(MESSAGE_ID_KEY));
        String msg = extras.getString(MESSAGE_TXT_KEY);
        String url = extras.getString(URL_KEY);
        
        Log.i(TAG, "Received id: " + id);
        Log.i(TAG, "Received message: " + msg);
        Log.i(TAG, "Received url: " + url);
        
        Intent resultIntent = new Intent(this, WebActivity.class);
        
        // Intentに一意となるタイプを設定する
        // 下記、現象の回避策
        // 複数のプッシュ通知を受信時、Intentに設定しているURLが異なっていても同一のものと判断されるため、PendingIntentが使い回され通知毎に生成されない。
        // そのため、プッシュ通知を開封した際、それぞれの通知に設定されているURL先のページに正しく遷移しない。
        resultIntent.setType(Integer.toString(id));
        
    	// URLが指定されている場合、Intentに設定する
        if (url != null) {
            resultIntent.putExtra(URL_KEY, url);
        }
        
        // ノーティフィケーションをタップした場合、アプリを起動させるため、PendingIntentを使用する
        PendingIntent resultPendingIntent = PendingIntent.getActivity(this, 0, resultIntent, PendingIntent.FLAG_UPDATE_CURRENT);
        builder.setContentIntent(resultPendingIntent);
        
        // ステータスバー、ノーティフィケーションのアイコン
        builder.setSmallIcon(R.drawable.ic_stat_notify_msg);
        
        // ステータスバーに通知直後に表示する文字列
        builder.setTicker(msg);
        
        // ノーティフィケーションのタイトル文字列
        builder.setContentTitle(getString(R.string.app_name));
        
        // ノーティフィケーションのコンテンツ文字列
        builder.setContentText(msg);
        
        // 端末で設定されているサウンドが再生される
        builder.setDefaults(Notification.DEFAULT_SOUND);
        
        // 通知を開いたらノーティフィケーション領域から削除する
        builder.setAutoCancel(true);
        
        // ノーティフィケーション表示
        NotificationManager notificationManager = (NotificationManager)this.getSystemService(Context.NOTIFICATION_SERVICE);
        notificationManager.notify(id, builder.build());
    }
}